﻿#include "mainwindow.h"
#include <QDebug>
#include <QTimer>
#include <QRandomGenerator>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("2D Game with Keyboard and Mouse");

    resize(1000,1000);

    gameOver = false;
    gameStarted = false;
    gameWon = false;

    // 初始化玩家角色的位置和大小
    playerRect = QRect(50, 50, 50, 50);

    // 初始化出口的位置和大小
    exitRect = QRect(width() - 100, height() - 100, 50, 50);

    // 初始化定时器
    obstacleTimer = new QTimer(this);
    connect(obstacleTimer, &QTimer::timeout, this, &MainWindow::moveObstacles);
}

MainWindow::~MainWindow()
{
    delete obstacleTimer;
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if (gameOver || gameWon) {
        return; // 如果游戏已经结束或成功，则不再响应键盘事件
    }

    if (!gameStarted) {
        startGame(); // 如果游戏未开始，按键后开始游戏
        // return;
    }

    QRect oldPlayerRect = playerRect; // 保存移动前的位置

    switch (event->key()) {
    case Qt::Key_W:
        playerRect.moveTop(playerRect.top() - moveStep);
        break;
    case Qt::Key_S:
        playerRect.moveTop(playerRect.top() + moveStep);
        break;
    case Qt::Key_A:
        playerRect.moveLeft(playerRect.left() - moveStep);
        break;
    case Qt::Key_D:
        playerRect.moveLeft(playerRect.left() + moveStep);
        break;
    case Qt::Key_R:
        qDebug() << "Reset player position";
        resetPlayerPosition();
        return;
    default:
        QMainWindow::keyPressEvent(event);
        return;
    }

    checkCollisions();
    checkWinCondition();

    update(); // 重新绘制窗口
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if (gameStarted || gameOver || gameWon) {
        return; // 如果游戏已经开始或结束，则不再响应鼠标事件
    }

    if (event->button() == Qt::LeftButton) {
        // 在点击位置放置一个新的障碍物
        QRect obstacle(event->pos(), QSize(50, 50));
        obstacles.append(obstacle);

        // 检查新障碍物是否与玩家角色重叠或与出口重叠
        if (playerRect.intersects(obstacle) || exitRect.intersects(obstacle)) {
            obstacles.removeLast(); // 如果重叠，则移除该障碍物
        }

        update(); // 重新绘制窗口
    }
}

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    // 绘制玩家角色（用绿色表示）
    painter.setBrush(Qt::green);
    painter.drawRect(playerRect);

    // 绘制障碍物（用红色表示）
    painter.setBrush(Qt::red);
    for (const QRect &obstacle : obstacles) {
        painter.drawRect(obstacle);
    }

    // 绘制出口（用蓝色表示）
    painter.setBrush(Qt::blue);
    painter.drawRect(exitRect);

    if (gameOver) {
        // 游戏结束时显示“Game Over!”文本
        painter.setPen(Qt::black);
        painter.setFont(QFont("Arial", 40, QFont::Bold));
        painter.drawText(rect(), Qt::AlignCenter, "Game Over!");
    } else if (gameWon) {
        // 游戏成功时显示“Congratulations!”文本
        painter.setPen(Qt::black);
        painter.setFont(QFont("Arial", 40, QFont::Bold));
        painter.drawText(rect(), Qt::AlignCenter, "Congratulations! You Won!");
    } else if (!gameStarted) {
        // 游戏未开始时提示用户按任意键开始
        painter.setPen(Qt::black);
        painter.setFont(QFont("Arial", 20, QFont::Bold));
        painter.drawText(rect(), Qt::AlignCenter, "Click to place obstacles. Press any key to start.");
    }
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    // 当窗口大小发生变化时，重新计算玩家和障碍物的位置
    exitRect.moveTo(width() - 100, height() - 100);
    update(); // 确保窗口内容重新绘制
}

void MainWindow::checkCollisions()
{
    // 检查玩家角色与所有障碍物的碰撞
    for (const QRect &obstacle : obstacles) {
        if (playerRect.intersects(obstacle)) {
            qDebug() << "Collision detected!";
            endGame(false);
            break;
        }
    }
}

void MainWindow::checkWinCondition()
{
    // 检查玩家是否到达出口
    if (playerRect.intersects(exitRect)) {
        qDebug() << "Player reached the exit!";
        endGame(true);
    }
}

void MainWindow::resetPlayerPosition()
{
    // 重置玩家角色到初始位置
    playerRect.moveTo(50, 50);
    update(); // 重新绘制窗口
}

void MainWindow::startGame()
{
    gameStarted = true;
    initializeObstacles(); // 初始化障碍物方向
    obstacleTimer->start(50); // 每50毫秒移动一次障碍物
}

void MainWindow::moveObstacles()
{
    for (int i = 0; i < obstacles.size(); ++i) {
        QRect &obstacle = obstacles[i];
        QPoint &direction = obstacleDirections[i];

        // 更新障碍物位置
        obstacle.moveTopLeft(obstacle.topLeft() + direction * obstacleSpeed);

        // 检查并处理障碍物的反弹
        if (obstacle.left() <= 0 || obstacle.right() >= width()) {
            direction.setX(-direction.x()); // 反转水平方向
        }
        if (obstacle.top() <= 0 || obstacle.bottom() >= height()) {
            direction.setY(-direction.y()); // 反转垂直方向
        }
    }
    update();
}

void MainWindow::initializeObstacles()
{
    obstacleDirections.clear();

    // 随机设置障碍物的初始方向
    for (const QRect &obstacle : obstacles) {
        QPoint direction(QRandomGenerator::global()->bounded(-1, 2), QRandomGenerator::global()->bounded(-1, 2));
        if (direction == QPoint(0, 0)) {
            direction.setX(1); // 避免障碍物静止不动
        }
        obstacleDirections.append(direction);
    }
}

void MainWindow::endGame(bool won)
{
    if (won) {
        gameWon = true;
    } else {
        gameOver = true;
    }
    obstacleTimer->stop(); // 停止障碍物移动
    update(); // 重新绘制窗口以显示结果

    // 在一段时间后退出游戏
    QTimer::singleShot(2000, this, &MainWindow::close);
}

